

package clases;

import java.util.Random;
import java.util.Vector;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.Persistence;

/**
 *CLASE CON TODOS LOS METODOS CORRESPONDIENTES AL MENU
 * 
 * @author juanjito
 */
public class Menu { 
public Receta ObtenerReceta(){
       EntityManagerFactory emf1 = Persistence.createEntityManagerFactory("recetasUnit");
        EntityManager em1;
        em1 = emf1.createEntityManager();
        em1.setFlushMode(FlushModeType.AUTO);
        Random rand = new Random();
        int x = 0;
       
     
       Vector<Receta> recetas = new Vector<Receta>(0,1);
        
        //Aqui sacamos toda la lista de resultados
        recetas = (Vector<Receta>)em1.createQuery("SELECT r FROM Receta r WHERE r.id>0").getResultList();
        x=rand.nextInt(recetas.size());
        return recetas.get(x);
   }
    public Receta CombinarReceta(Receta r1,Vector<Receta> recetas){
        //Establecemos una serie de criterios para que nos busque una receta
        //adecuada a la que ya tenemos
        Receta r_new= new Receta();
        Random rand = new Random();
        int i = 0;
        boolean enc=false;
        int control=0;
        
        while(!enc)
        {
            i=rand.nextInt(recetas.size());
        
        
            //Primero ponemos que no supere las mil Calorias
            if((r1.getKcal()+recetas.get(i).getKcal()<=900)&&
            //Que no superen 550 minutos de preparacion
            (r1.getDuracion()+recetas.get(i).getDuracion()<=550)&&
            //Que sean de diferente tipo
             (r1.getTipo()!=recetas.get(i).getTipo())&&
             //que no sea la misma receta
             (!r1.getNombre().equals(recetas.get(i).getNombre())))
            {
                r_new=recetas.get(i);
                enc=true;
                return r_new;
            }
            //Para que sino la encuentra en 100 iteraciones pare
            control++;
            if (control>=100)
                break;
        }
        return r_new;
    }
    public boolean CriterioDiario(Receta almuerzo, Receta cena)
    {
        //Que no pase de las calorias recomendadas
            if((almuerzo.getKcal()+cena.getKcal()<=1500)&&
             //Comprobamos que no sea un postre       
            (cena.getTipo().getNombre().compareTo("Postre")!=0)&&
            //Que sean de diferente tipo
             (almuerzo.getTipo()!=cena.getTipo())&&
             //que no sea la misma receta
             (!almuerzo.getNombre().equals(cena.getNombre())))
                    return true;
            else
                    return false;
    }
    
    public  Receta Cena(Vector<Receta> rs,Receta almuerzo){
       Receta cena = new Receta();
       Boolean enc=false;
       //Escogemos cena al azar para no tener siempre las mismas
       Random rand = new Random();
        int x = 0;
        
        while(!enc)
        {
            x=rand.nextInt(rs.size());
            if (CriterioDiario(almuerzo,rs.get(x)))
            {
                cena=rs.get(x);
                enc=true;
            }
        }
       return cena;
    }
   public  Vector<Receta> MenuDia(Vector<Receta> rs){
       Vector<Receta> r_dia = new Vector<Receta>(0,1);
       Receta cena = new Receta();
       
       //Elegimos una receta aleatoria
       Random rand = new Random();
        int x = rand.nextInt(rs.size());
       // Comprobamos que no sea un postre el almuerzo
       while(rs.get(x).getTipo().getNombre().compareTo("Postre")==0)
           x = rand.nextInt(rs.size());
        //La introducimos en el menu del dia
        r_dia.add(rs.get(x));
        //Ahora buscamos la cena para ese almuerzo
        cena = Cena(rs,rs.get(x));
        //Añadimos la cena
        r_dia.add(cena);
        
      return r_dia;
   }
   public  Vector<Receta> MenuSemanal(Vector<Receta> rs){
       Vector<Receta> m_semana = new Vector<Receta>(0,1);
       //Receta comida = new Receta();
       Vector<Receta> m_dia = new Vector<Receta>(0,1);
       int dia=1;
       boolean enc=false;
       boolean iguales=false;
       //Introducimos el primer menu el del lunes
       //Y ahora tenemos que introducir 6 menus mas
       //utilizamos los mismos criterios pero comprobamos que no halla
       //ningun plato repetido
       m_semana= MenuDia(rs);
        while(!enc)
        {
           m_dia = this.MenuDia(rs);
           iguales = false;
           for(int j=0; j<m_semana.size();j++)
           {
               if((m_semana.get(j)==m_dia.get(0))||(m_semana.get(j)==m_dia.get(1)))
               {
                  iguales=true;
               }
           }
           //sino son iguales a ninguno de la semana se introducen en el menu semanal
           if(!iguales)
           {
               m_semana.add(m_dia.get(0));
               m_semana.add(m_dia.get(1));
               dia++;
               if(dia==7)
                  enc=true;
           }
       }
       return m_semana;
   }
   public  Vector<Receta> ObtenerListaRecetas(){
       EntityManagerFactory emf = Persistence.createEntityManagerFactory("recetasUnit");
        EntityManager em;
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
       
       Vector<Receta> recetas = new Vector<Receta>(0,1);
        
        //Aqui sacamos toda la lista de resultados
        recetas = (Vector<Receta>)em.createQuery("SELECT r FROM Receta r WHERE r.id>0").getResultList();
        return recetas;
   }
}
